package com.health.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.health.mapper.CheckGroupMapper;
import com.health.pojo.CheckGroup;
import com.health.pojo.CheckGroupCheckItem;
import com.health.pojo.CheckItem;
import com.health.service.CheckGroupCheckItemService;
import com.health.service.CheckGroupService;
import com.health.service.CheckItemService;
import com.health.service.SetmealCheckGroupService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Service // 将类交给SpringBoot管理
@RequiredArgsConstructor
public class CheckGroupServiceImpl
        extends ServiceImpl<CheckGroupMapper, CheckGroup>
        implements CheckGroupService {

    private final CheckGroupCheckItemService checkGroupCheckItemService;
    private final SetmealCheckGroupService setmealCheckGroupService;
    private final CheckItemService checkItemService;

    /**
     * 添加检查组以及检查项关系
     *
     * @param checkGroup
     * @param checkItemIds
     */
    @Override
    @Transactional //控制整个方法当作一个事务处理
    public void addCheckGroup(CheckGroup checkGroup, Integer[] checkItemIds) {
        //操作两张表 t_checkgroup、t_checkgroup_checkitem
        //1. 添加检查组信息（id会自动生成）
        this.save(checkGroup);
        //2. 添加检查项关系
        //构建一个集合List<CheckGroupCheckItem>             List<Integer>  ->  List<CheckGroupCheckItem>
        List<CheckGroupCheckItem> list = Arrays.stream(checkItemIds)
                .map(checkItemId -> new CheckGroupCheckItem(null, checkGroup.getId(), checkItemId))
                .collect(Collectors.toList());

        /*ArrayList<CheckGroupCheckItem> list = new ArrayList<>();
        for (Integer checkItemId : checkItemIds) {
            CheckGroupCheckItem checkGroupCheckItem = new CheckGroupCheckItem(null, checkGroup.getId(), checkItemId);
            list.add(checkGroupCheckItem);
        }*/

        //批量保存
        checkGroupCheckItemService.saveBatch(list);
    }

    /**
     * 根据检查组查询对应检查项列表
     *
     * @param id
     * @return
     */
    @Override
    public List<CheckItem> getCheckItemsById(Integer id) {
        //1. 查询中间表，根据检查组id获取检查项id列表
        List<CheckGroupCheckItem> groupItems = checkGroupCheckItemService.query()
                .eq("checkgroup_id", id)
                .list();
        //提取List<CheckGroupCheckItem>集合中的每个检查项id    List<CheckGroupCheckItem> -> List<Integer>
        List<Integer> checkItemIds = groupItems.stream()
                .map(groupItem -> groupItem.getCheckitemId())
                .collect(Collectors.toList());

        //2. 查询检查项信息
        return checkItemService.query().in("id", checkItemIds).list();
    }

    /**
     * 更新检查组及检查项关系
     *
     * @param checkGroup
     * @param checkItemIds
     */
    @Override
    @Transactional //事务管理
    public void updateCheckGroup(CheckGroup checkGroup, Integer[] checkItemIds) {
        //1. 根据id更新检查组基本信息
        this.updateById(checkGroup);

        //2. 根据检查组的id删除中间表数据（清理原有关系）
        checkGroupCheckItemService.update()
                .eq("checkgroup_id", checkGroup.getId())
                .remove();

        //3. 重新建立检查组和检查项关系
        List<CheckGroupCheckItem> list = Arrays.stream(checkItemIds)
                .map(checkItemId -> new CheckGroupCheckItem(null, checkGroup.getId(), checkItemId))
                .collect(Collectors.toList());
        checkGroupCheckItemService.saveBatch(list);
    }

    /**
     * 删除检查组以及检查项关系
     *
     * @param id
     */
    @Override
    @Transactional
    public void deleteCheckGroup(Integer id) {
        //1. 判断是否与套餐相关联
        Long count = setmealCheckGroupService.query()
                .eq("checkgroup_id", id)
                .count();
        if (count > 0) {
            //不能删除
            throw new RuntimeException("该检查组被套餐关联，不能删除");
        }

        //2. 删除检查组
        this.removeById(id);
        //3. 删除检查组对应的关系表数据
        checkGroupCheckItemService.update()
                .eq("checkgroup_id", id)
                .remove();
    }
}
